周志华《机器学习》习题解答:Ch5.7 - RBF网络实验



编程实现单层RBF神经网络,并在异或数据集上进行了实验。

相关源代码托管于Github:PnYuan/Machine-Learning_ZhouZhihua,欢迎访问.

题目

注:本题程序基于Python实现(这里查看完整代码和数据集)。

RBF网络基础知识回顾

RBF网络采用RBF(Radial Basis Function函数)作为隐层神经元激活函数,是一种局部逼近神经网络,下面先分析其激活函数RBF,然后分析RBF神经网络的结构。

径向基函数(RBF)

径向基函数是一类取值依赖样本于到中心点距离的函数,本题基于常用的高斯径向基函数(gaussian RBF)开展实验。下面是高斯径向基函数形式书p108式(5.19):

这里的 β 为尺度系数, c_i 为中心点(维度由输入决定),函数的取值取决于样本 x 到中心点的距离(2-范数),该函数的参数为 (β, c_i)。

如下图示为高斯径向基函数示意图(绘图程序):

RBF网络

RBF神经网络一般指一种单隐层前馈神经网络,它使用径向基函数作为隐层神经元激活函数,而输出是隐层输出的线性组合,网络结构示意如下:

参考书p108式(5.18),该神经网络的输出为:

进一步分析,一般函数均可表示成一组基函数的线性组合,而RBF网络相当于用隐层神经元构建了这样一组基函数,由输出层进行线性组合,从而实现函数逼近的功能。

RBF网络实现

查看完整代码

这里RBF神经网络建模的过程分一下两步:

  1. 确定神经元对应的高斯径向基函数中心 c ;
  2. 利用BP算法来训练剩余参数 w, β ;

下面依次讨论其实现:

RBF中心参数获取

RBF的中心参数 c 的获取方法有以下一些:

  • 从输入数据样本中抽取,这就要求输入样本具有较好的代表性;
  • 自组织生成,如聚类法生成,采用聚类中心来作为中心参数 c ,同时根据各中心的距离来初始化尺度系数 β ;

RBF-BP算法推导

参考神经网络基础 - 编程实现标准BP算法,这里隐层激活函数为RBF,输出层神经元数为 1 ,激活函数为 y=f(x)=x 。

BP算法采用梯度下降法进行参数迭代更新,参考书p102-103,进行RBF-BP算法中基于梯度下降的参数更新推导如下:

在完成基础推导之后,给出RBF网络的BP算法如下所示:

RBF-BP算法实现

样例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def BackPropagateRBF(self, x, y):
'''
the implementation of special BP algorithm on one slide of sample for RBF network
@param x, y: array and float, input and output of the data sample
'''

# dependent packages
import numpy as np

# get current network output
self.y = self.Pred(x)

# calculate the gradient for hidden layer
g = np.zeros(self.h_n)
for h in range(self.h_n):
g[h] = (self.y - y) * self.b[h]

# updating the parameter
for h in range(self.h_n):
self.beta[h] += self.lr * g[h] * self.w[h] * np.linalg.norm(x-self.c[h],2)
self.w[h] -= self.lr * g[h]

异或问题实验

查看完整代码

准备数据

首先基于numpy.array生成异或数据,该数据为2输入,1输出,如下所示:

样例代码:

1
2
3
# train set
X_trn = np.random.randint(0,2,(100,2))
y_trn = np.logical_xor(X_trn[:,0],X_trn[:,1])

样例数据:

>>> X_trn
array([[0, 0],
       [1, 1],
       ...
>>> y_trn
array([False, False, ...

参数之-RBF中心点

这里由于采用异或数据,其中心点可以简单设置如下:

centers = np.array([[0,0],[0,1],[1,0],[1,1]])

同时取隐节点数目为4。

生成模型并训练

样例代码如下:

1
2
3
4
5
6
7
# construct the network
rbf_nn = RBP_network() # initial a BP network class
rbf_nn.CreateNN(4, centers, learningrate=0.05) # build the network structure

# parameter training(这里迭代10次)
for i in range(10):
rbf_nn.TrainRBF(X_trn, y_trn)

绘制出训练过程中的均方误差变化曲线如下图:

由上图可以看到,曲线收敛十分迅速,说明这里的RBF网络训练异或数据集十分轻松,这也和我们所生成的数据的完备无误有关。

测试模型

按照训练集数据生成方法生成测试集数据,通过模型预测,得出结果如下:

test error rate: 0.000

即测试错误率为0,可知我们的模型预测十分准确的,泛化性能优秀(主要得益于XOR预测模型对RBF网络来说太过简单)。

本题小结

回顾RBF网络工作原理,如参考书p108式(5.18)-(5.19)。RBF网络建模类似于非线性模型中的基函数建模,进一步,我们可将其与广义可加模型联系起来。RBF网络采用径向基函数作为单隐层激活函数(即核函数),又可将其与SVM with RBF kernel联系起来。

回顾RBF网络实现过程,我们或可将该方法视为一种半监督的学习方法,具体有:

  • step 1:无监督的学习,从数据中获取中心参数,常用聚类方法;
  • step 2:有监督的学习,基于数据训练参数,过程一般基于BP算法实现;

相关参考

下面列出一些参考内容: